package main

//给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
//
// 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
//
//
//
// 示例 1：
//
//
//输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[[7,4,1],[8,5,2],[9,6,3]]
//
//
// 示例 2：
//
//
//输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
//输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
//
//
//
//
// 提示：
//
//
// n == matrix.length == matrix[i].length
// 1 <= n <= 20
// -1000 <= matrix[i][j] <= 1000
//
//
//
// Related Topics 数组 数学 矩阵 👍 1209 👎 0

//leetcode submit region begin(Prohibit modification and deletion)
func rotate(matrix [][]int) {
	// 一层一层的转
	// 一共有 n/2 层需要旋转，如果n是奇数，最中间那层不需要旋转，如果n是偶数，那正好就是 n/2 层需要旋转
	// 何为一层，对于第x层（x从0开始）的定义为matrix[x][x]~matrix[x][n-1-x]~matrix[n-1-x][n-1-x]～matrix[n-1-x][x]~matrix[x][x]
	// 替换一层，其实就是替换一边，因为在替换一边的时候，为了实现 【在 原地 旋转图像】 这一要求，每个点都会影响其对应的另外三边的点一起完成替换
	n := len(matrix)
	indexN := n - 1
	for x := 0; x < n/2; x++ {
		var tmp int
		// 一个边上首尾的替换是相随的，完成了首的替换，尾部就会随着替换了，因此 i+x < n-1
		for i := 0; i+x < indexN-x; i++ {
			// 对上横边从左往右替换，替换为左竖边的从下往上
			tmp, matrix[x][x+i] = matrix[x][x+i], matrix[indexN-x-i][x]
			// 对右竖边从上往下替换，替换为上横边的从左往右
			tmp, matrix[x+i][indexN-x] = matrix[x+i][indexN-x], tmp
			// 对下横边从右往左替换，替换为右竖边的从上往下
			tmp, matrix[indexN-x][indexN-x-i] = matrix[indexN-x][indexN-x-i], tmp
			// 对左竖边从下往上替换，替换为下横边的从右往左
			matrix[indexN-x-i][x] = tmp
		}
	}
}

//leetcode submit region end(Prohibit modification and deletion)
